$$ \newcommand{\floor}[1]{\left\lfloor{#1}\right\rfloor} \newcommand{\ceil}[1]{\left\lceil{#1}\right\rceil} \renewcommand{\mod}{\,\mathrm{mod}\,} \renewcommand{\div}{\,\mathrm{div}\,} \newcommand{\metar}{\,\mathrm{m}} \newcommand{\cm}{\,\mathrm{cm}} \newcommand{\dm}{\,\mathrm{dm}} \newcommand{\litar}{\,\mathrm{l}} \newcommand{\km}{\,\mathrm{km}} \newcommand{\s}{\,\mathrm{s}} \newcommand{\h}{\,\mathrm{h}} \newcommand{\minut}{\,\mathrm{min}} \newcommand{\kmh}{\,\mathrm{\frac{km}{h}}} \newcommand{\ms}{\,\mathrm{\frac{m}{s}}} \newcommand{\mss}{\,\mathrm{\frac{m}{s^2}}} \newcommand{\mmin}{\,\mathrm{\frac{m}{min}}} \newcommand{\smin}{\,\mathrm{\frac{s}{min}}} $$

Prijavi problem


Obeleži sve kategorije koje odgovaraju problemu

Još detalja - opišite nam problem


Uspešno ste prijavili problem!
Status problema i sve dodatne informacije možete pratiti klikom na link.
Nažalost nismo trenutno u mogućnosti da obradimo vaš zahtev.
Molimo vas da pokušate kasnije.

Генерисање комбинаторних објеката

Проблеми се често могу решити исцрпном претрагом (грубом силом), што подразумева да се испитају сви могући кандидати за решења. Предуслов за то је да умемо све те кандидате да набројимо. Иако у реалним применама простор потенцијалних решења може имати различиту структуру, показује се да је у великом броју случаја то простор одређених класичних комбинаторних објеката: свих подскупова неког коначног скупа, свих варијација (са или без понављања), свих комбинација (са или без понављања), свих пермутација, свих партиција и слично. У овом поглављу ћемо проучити механизме њиховог систематичног генерисања. Нагласимо да по правилу оваквих објеката има експоненцијално много у односу на величину улаза, тако да су сви алгоритми практично неупотребљиви осим за веома мале димензије улаза.

Објекти се обично представљају \(n\)-торкама бројева, при чему се исти објекти могу торкама моделовати на различите начине. На пример, сваки подскуп скупа \(\{a_0, \ldots, a_{n-1}\}\) се може представити коначним низом индекса елемената који му припадају. Да би сваки подскуп био јединствено представљен, потребно је да тај низ буде канонизован (на пример, уређен строго растући). На пример, торка \((0, 2, 3)\) једнозначно одређује подскуп \(\{a_0, a_2, a_3\}\). Други начин да се подскупови представе су \(n\)-торке логичких вредности или вредности 0-1. На пример, ако је \(n=6\), и ако претпоставимо да се битови слева надесно, тада торка \(1011\) означава скуп \(\{a_0, a_2, a_3\}\).

Сви објекти се обично могу представити дрветом и то дрво одговара процесу њиховог генерисања тј. обиласка (оно се не прави експлицитно, у меморији, али нам помаже да разумемо и организујемо поступак претраге). Обилазак дрвета се најједноставније изводи у дубину (често рекурзивно). За прву наведену репрезентацију подскупова дрво је дато на слици \(\ref{podskupovi-drvo-1}\). Сваки чвор дрвета одговара једном подскупу, при чему се одговарајућа торка очитава на гранама пута који води од корена до тог чвора.

Сви подскупови четворочланог скупа - сваки чвор дрвета одговара једном подскупу

За другу наведену репрезентацију подскупова дрво је дато на слици \(\ref{podskupovi-drvo-2}\). На почетку се бира да ли ће елемент \(a_0\) бити укључен у подскуп, на наредном нивоу да ли ће бити укључен елемент \(a_1\), затим елемент \(a_2\) и тако даље. Само листови дрвета у којима је за сваки елемент донета одлука да ли припада или не припада подскупу, одговарају подскуповима, при чему се одговарајућа торка логичких вредности очитава на гранама пута који води од корена до тог чвора.

Сви подскупови четворочланог скупа - сваки лист дрвета одговара једном подскупу

Приметимо да оба дрвета садрже \(2^n\) чворова којима се представљају подскупови (у првом случају су то сви чворови дрвета, а у другом само листови).

Приликом генерисања објеката често је пожељно ређати их одређеним редом. С обзиром на то то да се сви комбинаторни објекти представљају одређеним торкама (коначним низовима), природан поредак међу њима је лексикографски поредак (који се користи за утврђивање редоследа речи у речнику). Подсетимо се, торка \(a_0\ldots a_{m-1}\) лексикографски претходи торци \(b_0\ldots b_{n-1}\) акко постоји неки индекс \(i\) такав да за свако \(0 \leq j < i\) важи \(a_j = b_j\) и важи или да је \(a_i < b_i\) или да је \(i = m < n\). На пример важи да је \(11 < 112 < 221\) (овде је \(i=2\), а затим \(i=0\)).

На пример, ако подскупове скупа \(\{1, 2, 3\}\) представимо на први начин, торкама у којима су елементи уређени растуће, лексикографски поредак би био \(\emptyset\), \(\{1\}\), \(\{1, 2\}\), \(\{1, 2, 3\}\), \(\{1, 3\}\), \(\{2\}\), \(\{2, 3\}\), \(\{3\}\). Ако бисмо их представљали на други начин, торкама у којима се нулама и јединицама одређује да ли је неки елемент укључен у подскуп, лексикографски редослед би био: 000 (\(\emptyset\)), 001 (\(\{3\}\)), 010(\(\{2\}\)), 011(\(\{2, 3\}\)), 100(\(\{1\}\)), 101(\(\{1,3\}\)), 110(\(\{1,2\}\)) и 111(\(\{1,2,3\}\)).

У наставку ће бити приказано како је могуће набројати све објекте који имају неку задату комбинаторну структуру. У већини задатака могуће је разматрати две врсте решења. Једна група решења је заснована на рекурзивном поступку набрајања објеката, док је друга група решења заснована на проналажењу наредног комбинаторног објекта у односу на неки задати редослед (најчешће лексикорафски).

Генерисање комбинаторних објеката — zadaci

Следећа варијација

Za ovaj zadatak možete videti rešenje
pokušalo: 389, rešilo: 91%

Следећи подскуп

pokušalo: 261, rešilo: 72%

Следећи бинарни низ без суседних јединица

pokušalo: 141, rešilo: 85%

Следећа комбинација

Za ovaj zadatak možete videti rešenje
pokušalo: 308, rešilo: 73%

Следећа пермутација

Za ovaj zadatak možete videti rešenje
pokušalo: 238, rešilo: 84%

Следећа партиција

pokušalo: 138, rešilo: 63%

Лексикографски наредна шетња

pokušalo: 50, rešilo: 78%

Све варијације

Za ovaj zadatak možete videti rešenje
pokušalo: 459, rešilo: 94%

Све речи од датих слова

pokušalo: 338, rešilo: 67%

Сви подскупови

pokušalo: 253, rešilo: 82%

Сви подскупови лексикографски

pokušalo: 197, rešilo: 78%

Сви бинарни низови без суседних јединица

pokušalo: 117, rešilo: 91%

Бројеви који у бинарном запису немају две суседне нуле

Za ovaj zadatak možete videti rešenje
pokušalo: 68, rešilo: 85%

Све комбинације

Za ovaj zadatak možete videti rešenje
pokušalo: 404, rešilo: 88%

Све комбинације са понављањем

pokušalo: 165, rešilo: 93%

Све пермутације

Za ovaj zadatak možete videti rešenje
pokušalo: 365, rešilo: 66%

Сви палиндроми од дате речи

pokušalo: 112, rešilo: 67%

Све партиције

Za ovaj zadatak možete videti rešenje
pokušalo: 285, rešilo: 96%

Све једноцифрене партиције

pokušalo: 83, rešilo: 85%

Сви распореди заграда

pokušalo: 149, rešilo: 59%

Варијације без понављања

Za ovaj zadatak možete videti rešenje
pokušalo: 89, rešilo: 92%

Покривање табле 2xk доминама 2x1

Za ovaj zadatak možete videti rešenje
pokušalo: 34, rešilo: 94%

Разлика суседних цифара k

pokušalo: 275, rešilo: 84%

Комплетан Грејов код

Za ovaj zadatak možete videti rešenje
pokušalo: 52, rešilo: 80%

Подела на палиндромске подниске

Za ovaj zadatak možete videti rešenje
pokušalo: 61, rešilo: 88%

K-та тешка реч

Za ovaj zadatak možete videti rešenje
pokušalo: 50, rešilo: 74%

Број израза дате вредности

Za ovaj zadatak možete videti rešenje
pokušalo: 35, rešilo: 25%

Сви распореди заграда дате дубине

pokušalo: 246, rešilo: 98%

Све допуне заграда

pokušalo: 55, rešilo: 60%

Допуна бинарних низова без суседних јединица

pokušalo: 42, rešilo: 73%

Вагони са 4 седишта

pokušalo: 29, rešilo: 31%